trait bound
トレイト制約_、トレイト境界_
genericな型に対して、traitで制限を設ける
hsの型クラス制約と同じmrsekut.icon
いくつかの書き方がある
インライン記法
上にも書いた「:」で指定するもの
code:rs
fn hoge<T: HogeTrait>(t: T) {
...
}
複数ある場合は+で繋ぐ
code:rs
fn top_ten<T: Debug + Hash + Eq>(values: &Vec<T>) {..}
where記法
whereを使う
冗長だがもっとも柔軟な書き方
trait自信がgenricsだと、これでしか書けない
code:rs
fn hoge<T>(t: T)
where
T: HogeTrait
{
...
}
impl Trait記法
implを使う
型パラメータを明示せずにかける
ただし、その本来の型パラメータなるものを使いまわしできない
引数、戻り値にそれを指定するとか
code:rs
fn hoge(t: impl HogeTrait){
...
}
他言語で似てる機能
Javaのbounded type
ScalaのUpper BoundやLower Bound
https://docs.scala-lang.org/tour/upper-type-bounds.html
Swiftのtype contrains
https://doc.rust-jp.rs/book-ja/ch17-01-what-is-oo.html
/mrsekut-book-4873118557/259
あまり真面目に読んでないmrsekut.icon
「トレイト境界」という訳について
https://github.com/rust-lang-ja/book-ja/issues/172
「トレイト制約」の方が良さげかも、という議論